#[path="src/args.rs"]
mod args ;

use std::{env, error::Error} ;

use clap::CommandFactory; // 允许创建命令行参数解析器
use clap_complete::{Shell, generate_to} ;  // 用于生成命令行补全脚本
use vergen_gitcl::{BuildBuilder , Emitter, GitclBuilder , RustcBuilder} ;   // 用于生成构建信息

fn main() -> Result<() , Box<dyn Error>> {
    Emitter::default() // 发射器实例
        .add_instructions(
            &BuildBuilder::default()
                .build_date(true)// 生成构建日期
                .build()? // 构建BuildBuilder
        )? 
        .add_instructions(
            &RustcBuilder::default()
                .commit_date(true) // 提交日期
                .commit_hash(true) // 提交哈希
                .host_triple(true) // 主机三元组
                .semver(true) // 语义版本号
                .build()?, // 构建RustcBuilder
        )?
        .add_instructions(
            &GitclBuilder::default()
                .commit_date(true) // 提交日期
                .sha(true) // 提交哈希
                .build()? // 构建GitclBuilder
        )? 
        .emit()?; // 将所有添加到Emitter中的指令生成到一个文件中

    if env::var_os("JIZI_GEN_COMPLETIONS").is_none() { // 检查环境变量是否存在 如果不存在则不需要生成这个脚本  直接ok
        return Ok(()) ;
    }
    let cmd = &mut args::Args::command() ; // 创建命令行参数解析器 用于生成命令行补全脚本
    let bin = "jizi" ; // 姬子
    let out = "completions" ; // 命令行补全脚本的输出目录

    std::fs::create_dir_all(out)?; // 如果不存在则创建

    for sh in [Shell::Bash , Shell::Fish , Shell::Zsh, Shell::Elvish , Shell::PowerShell] { // 遍历支持的shell类型
        generate_to(sh, cmd, bin , out) ? ; // 为当前shell类型生成补全脚本
    }

    generate_to(clap_complete_nushell::Nushell , cmd , bin , out ) ? ; // 为nushell生成补全脚本
    generate_to(clap_complete_fig::Fig,cmd, bin , out)? ; // 为fig生成补全脚本
    Ok(())
}